Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 курс / Лекции / Лекция 25 - Архитектура и программирование сопроцессора.ppt
Скачиваний:
42
Добавлен:
18.02.2023
Размер:
539.14 Кб
Скачать

Пример 1

Написать программу для вычисления значения выражения:

x2 y2 tg(x),

x y 0

f (x y)3

sin(x),

x y 0

 

 

 

 

 

3

cos(x),

x y 0

( y x)

 

Пример 1

include \masm32\include\masm32rt.inc

.data?

valX dq ? valY dq ? valZ dq ?

.data

 

 

 

mess1

db

'Input X: ',0

;Приглашение к вводу Х

mess2

db

'Input Y: ',0

;Приглашение к вводу У

mess3

db

'Result: ', 0

;Сообщение о выводе результата

buff

db 50 dup(0)

;Буфер для ввода данных

endl

db

0dh, 0ah, 0

;Перевод строки

 

 

 

 

Пример 1

start:

call main inkey exit

main proc cls

invoke StdOut, ADDR mess1 invoke StdIn, ADDR buff, 50

invoke StrToFloat, ADDR buff, ADDR valX

invoke StdOut, ADDR mess2 invoke StdIn, ADDR buff, 50

invoke StrToFloat, ADDR buff, ADDR valY

fld qword ptr valX fcomp qword ptr valY fstsw ax

sahf

jz

func1

jnc

func2

jmp

func3

func1:

 

call

Func01

jmp

toquit

func2:

 

call

Func02

jmp

toquit

func3:

 

call

Func03

toquit:

 

fstp

qword ptr valZ

invoke FloatToStr, valZ, ADDR buff invoke StdOut, ADDR mess3 invoke StdOut, ADDR buff

invoke StdOut, ADDR endl ret

main endp

Пример 1

Func01

proc

 

 

fld

qword ptr valY

;Заносим Y в st(0)

 

fmul

st(0), st

;Вычисление Y*Y в st(0)

 

fld

qword ptr valX

;Заносим X в st(0)

 

fld

st(0)

;Копируем st(0) в st(1)

 

fmul

st(1), st

;Вычисление X*X в st(1)

 

fptan

 

;Вычисление тангенса

 

fincstp

 

;Удаление 1 из вершины стека

 

faddp

st(1),st

;Сложение st(1) и st и

 

выталкивание st

 

 

faddp

st(1),st

;Сложение st(1) и st и

 

выталкивание st

 

 

ret

;Выход

 

Func01

endp

 

 

 

 

 

Пример 1

Func02

proc

Func03

proc

fld

qword ptr valX

fld

qword ptr valY

fsub

qword ptr valY

fsub

qword ptr valX

fld

st(0)

fld

st(0)

fmul

st(1), st

fmul

st(1), st

fmulp

st(1), st

fmulp

st(1), st

fld

qword ptr valX

fld

qword ptr valX

fsin

 

fcos

 

faddp

st(1), st

faddp

st(1), st

ret

 

ret

 

Func02

endp

Func03

endp

Пример 2

Вывести на экран таблицу значений функции:

Y=X^K

Все параметры задает пользователь:K – степень (вещественное значение);

X – вещественное значение, задается диапазоном [A;B], 0≤A<B;

N – количество строк в таблице.

Пример 2 (данные

.data?

dq

?

;Левая граница интервала

valA

программы)

 

valB

dq

?

;Правая граница интервала

valK

dq

?

;Степень

valX

dq

?

;Текущий аргумент функции

valY

dq

?

;Текущее значение функции

valH

dq

?

;Шаг приращения аргумента

valN

dd

?

;Количество строк в таблице

.data

 

 

 

mess01

db

'Input A: ', 0

mess02

db

'Input B: ', 0

mess03

db

'Input K: ', 0

mess04

db

'Input N: ', 0

tblhead

db

' X

Y',0dh,0ah,'------+------',0dh,0ah,0

endl

db

0dh, 0ah, 0

delim

db

09h, ' | ', 09h, 0

err00

db

'Incorrect A!', 0dh, 0ah, 0

err01

db

'Incorrect A and B!', 0dh, 0ah, 0

err02

db

'Incorrect N!', 0dh, 0ah, 0

buff

db

50 dup(0)

 

 

 

 

 

Пример 2 (ввод интервала)

main proc

 

 

 

 

invoke

StdOut, ADDR mess01

 

 

 

invoke

StdIn, ADDR buff, 50

 

 

 

invoke

StrToFloat, ADDR buff, ADDR valA

 

fldz

 

;Загрузка нуля

 

fcomp

qword ptr valA

;Сравнение с A

 

fstsw

ax

;Сохранение слова состояния FPU

 

sahf

 

;Запись состояния в регистр флагов

 

jna

next00

;Переход, если 0<A

 

invoke

StdOut, ADDR err00

;Вывод сообщения об ошибке

 

ret

 

;Завершение main

next00:

 

 

 

 

invoke

StdOut, ADDR mess02

 

 

 

invoke

StdIn, ADDR buff, 50

 

 

 

invoke

StrToFloat, ADDR buff, ADDR valB

 

fld

qword ptr valB

;Загрузка B

 

fcom

qword ptr valA

;Сравнение с A

 

fstsw

ax

;Сохранение слова состояния FPU

 

sahf

 

;Запись состояния в регистр флагов

 

ja

next01

;Переход, если A<B

 

invoke

StdOut, ADDR err01

;Вывод сообщения об ошибке

 

ret

 

;Завершение main

 

 

 

 

 

Пример 2 (ввод K и N)

next01:

 

 

invoke

StdOut, ADDR mess03

 

invoke

StdIn, ADDR buff, 50

 

invoke

StrToFloat, ADDR buff, ADDR valK

invoke

StdOut, ADDR mess04

 

invoke

StdIn, ADDR buff, 50

 

invoke

atol, ADDR buff

 

cmp

eax, 0

;Проверка N>0

jg

next02

 

invoke

StdOut, ADDR err02

 

ret

 

 

Пример 2 (подготовка к выводу таблицы)

next02:

 

 

 

 

 

mov

dword ptr valN, eax

 

 

 

fsub

qword ptr valA

;Вычисление B - A

 

fild

dword ptr valN

;Загрузка количества строк

 

fld1

 

;Загрузка единицы

 

fsubp

st(1), st

;Вычисление N - 1

 

fdivp

st(1), st

;Вычисление (B-A)/(N-1)

 

fstp

qword ptr valH

;Сохранение шага

 

mov

eax, dword ptr valA

;Инициализация X

 

mov

dword ptr valX, eax

 

 

 

mov

eax, dword ptr valA + 4

 

 

 

mov

dword ptr valX + 4, eax

 

 

 

invoke

StdOut, ADDR tblhead

;Вывод заголовка

таблицы

 

 

 

 

 

mov

ecx, dword ptr valN

;Установка количества

 

 

 

 

;итераций